<!DOCTYPE html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <meta charset="utf-8" />
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      body {
        font: 13px Helvetica, Arial;
      }

      form {
        background: #000;
        padding: 3px;
        position: fixed;
        bottom: 0;
        width: 100%;
      }

      form input {
        border: 0;
        padding: 10px;
        width: 90%;
        margin-right: 0.5%;
      }

      form button {
        width: 9%;
        background: rgb(130, 224, 255);
        border: none;
        padding: 10px;
      }

      #messages {
        list-style-type: none;
        margin: 0;
        padding: 0;
      }

      #messages li {
        padding: 5px 10px;
      }

      #messages li:nth-child(odd) {
        background: #eee;
      }
    </style>
  </head>

  <body>
    <!-- 消息列表 -->
    <ul id="messages"></ul>

    <!-- 发送消息的表单 -->
    <form action="">
      <input id="m" autocomplete="off" />
      <button>Send</button>
    </form>

    <script src="https://cdn.bootcdn.net/ajax/libs/socket.io/4.1.3/socket.io.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
    <script>
      // 建立链接
      const socket = io('http://toutiao.itheima.net', {
        query: {
          token:
            'c6b75a70-d6ae-49d0-bba9-d150a89f8a4e","refresh_token":"fec3a698-1a64-4669-ace7-7bb815d141db'
        },
        // 使用websocket 协议通信 否则默认使用轮询方案
        transports: ['websocket']
      })
      // 当客户端与服务器链接成功 open事件 socket 会触发 connect事件
      // 在socket 中 使用on语法注册事件
      socket.on('connect', function () {
        console.log('链接成功')
        $('#messages').append(`<li>与服务链接成功</li>`)
      })

      // 发送消息
      $('form').on('submit', (e) => {
        e.preventDefault()
        // 需要服务器发送消息 原生send socked通过emit来触发message事件 message事件由接口文档决定
        // socket.emit('message',消息）
        socket.emit('message', {
          msg: $('#m').val().trim(),
          timestamp: Date.now()
        })
        $('#messages').append(`<li>我说${$('#m').val().trim()}</li>`)
      })

      // 获取服务端响应结果 客户端需要监听message 事件 message事件由接口文档决定
      socket.on('message', (data) => {
        console.log(data)
        $('#messages').append(`<li>服务器说${data.msg}</li>`)
      })
    </script>
  </body>
</html>
